package com.gxa.hualianeshop.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

@Configuration
public class RabbitConfig {
    //------------------------设置订单部分的交换机/队列/路由名称----------------

    // 订单交换机的名称
    public static final String ORDER_EXCHANGE = "order_exchange";
    // 订单队列名
    public static final String ORDER_QUEUE = "order_queue";
    // 订单路由key
    public static final String ORDER_ROUTING_KEY = "orderKey";

    //------------------------设置死信部分的交换机/队列/路由名称---------------
    //死信交换机
    public static final String DLX_EXCHANGE = "dlx_exchange";
    //死信队列
    public static final String DLX_QUEUE = "dlx_queue";
    //死信路由
    public static final String DLX_ROUTING_KEY = "dlxrRoutingKey";

    //------------------------配置死信部分的交换机/队列/路由-------------------

    //死信交换机
    @Bean
    public DirectExchange createDlxExchange() {
        return new DirectExchange(DLX_EXCHANGE);
    }

    //声明死信队列 (真正的队列)
    @Bean
    public Queue createDlxQueue() {
        return new Queue(DLX_QUEUE);
    }

    /**
     * （死信交换机+死信路由->死信队列 的绑定）
     */
    @Bean
    public Binding dlxBinding() {
        return BindingBuilder.bind(createDlxQueue()).to(createDlxExchange()).with(DLX_ROUTING_KEY);
    }

    //------------------------配置订单部分的交换机/队列/路由-------------------

    /**
     * 定义一个默认的direct类型的Exchange(交换机)
     *
     * @return 返回该交换机
     */
    @Bean
    DirectExchange createOrderExchange() {
        return new DirectExchange(ORDER_EXCHANGE);
    }

    /**
     * 声明订单队列
     */
    @Bean(ORDER_QUEUE)
    public Queue createOrderQueue() {
        // durable:是否持久化,默认是false,持久化队列：会被存储在磁盘上，当消息代理重启时仍然存在，暂存队列：当前连接有效
        // exclusive:默认也是false，只能被当前创建的连接使用，而且当连接关闭后队列即被删除。此参考优先级高于durable
        // autoDelete:是否自动删除，当没有生产者或者消费者使用此队列，该队列会自动删除。
        //一般设置一下队列的持久化就好,其余两个就是默认false
        // return new Queue("ORDER_QUEUE",true,false,false);
        //再看参数部分: 目的是当消息队列的过期时间TTL到期,消息就会被添加到死信队列中去
        Map<String, Object> arguments = new HashMap<>(2);
        // 绑定死信交换机
        arguments.put("x-dead-letter-exchange", DLX_EXCHANGE);
        // 绑定路由key
        arguments.put("x-dead-letter-routing-key", DLX_ROUTING_KEY);
        return new Queue(ORDER_QUEUE, true, false, false, arguments);
    }

    /**
     * 绑定消息队列到交换机
     */
    @Bean
    public Binding OrderBinding() {
        // 绑定消息通道到交换机上,并设置判断路由的key为
        return BindingBuilder.bind(createOrderQueue()).to(createOrderExchange()).with(ORDER_ROUTING_KEY);
    }
}
